package com.shujia.sql

import org.apache.spark.SparkContext
import org.apache.spark.sql.{DataFrame, Row, SparkSession}
import org.apache.spark.storage.StorageLevel

object Demo1SparkSessio {
  def main(args: Array[String]): Unit = {

    /**
     * SparkSession：Spark 2.0引入新的入口
     */

    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("Demo1SparkSessio")
      .getOrCreate()

    // 如果还需要使用RDD的sc 可以直接通过SparkSession创建
    //    val sc: SparkContext = spark.sparkContext
    //    sc.textFile()

    // 读取students.txt数据
    /**
     * 读取文本类的数据 默认是用csv方法去读取
     * 文本类的数据一般都没有表头
     * 需要手动指定
     */
    val stuDF: DataFrame = spark
      .read
      .schema("id Int,name String,age Int,gender String,clazz String") // 手动指定每一列数据的列名及类型
      .csv("Spark/data/stu/students.txt")

    // 对使用了多次的DataFrame进行缓存
    stuDF.cache()
    //    stuDF.persist(StorageLevel.MEMORY_AND_DISK_SER)

    // show action算子
    stuDF.show() // 默认显示前20条数据
    stuDF.show(10) // 显示前10条数据
    stuDF.show(10, truncate = false) // 完整地显示前10条数据

    // 查询age>23的学生
    // DSL的方式
    stuDF
      .where("age>23") // 传入一个字符串表达式
      .show(200)

    /**
     * SQL的方式:
     * 1、先创建一张临时视图
     * 2、通过sql进行查询
     */
    stuDF.createOrReplaceTempView("stu")

    val ageDF: DataFrame = spark.sql("select * from stu where age>23")

    ageDF.show()

    // RDD的方式
    stuDF.filter((row: Row) => {
      // row ：Row对象
      // Row 表示DataFrame里的一条数据
      val age: Int = row.getAs[Int]("age")
      age > 23
    }).show(10)

    // 用完记得释放缓存
    stuDF.unpersist()

    while (true) {

    }

  }

}
